{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Predict Future Sales"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import seaborn as sns\n",
    "import warnings\n",
    "import datetime\n",
    "warnings.filterwarnings(\"ignore\")\n",
    "\n",
    "import logging\n",
    "logger = logging.getLogger()\n",
    "logger.setLevel(logging.CRITICAL)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "sales=pd.read_csv(\"data/sales_train.csv\")\n",
    "item_cat=pd.read_csv(\"data/item_categories.csv\")\n",
    "item=pd.read_csv(\"data/items.csv\")\n",
    "shops=pd.read_csv(\"data/shops.csv\")\n",
    "test=pd.read_csv(\"data/test.csv\")\n",
    "#formatting the date column correctly\n",
    "sales.date=sales.date.apply(lambda x:datetime.datetime.strptime(x, '%d.%m.%Y'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th colspan=\"2\" halign=\"left\">date</th>\n",
       "      <th>item_price</th>\n",
       "      <th>item_cnt_day</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>min</th>\n",
       "      <th>max</th>\n",
       "      <th>mean</th>\n",
       "      <th>sum</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date_block_num</th>\n",
       "      <th>shop_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"20\" valign=\"top\">0</th>\n",
       "      <th rowspan=\"20\" valign=\"top\">0</th>\n",
       "      <th>32</th>\n",
       "      <td>2013-01-03</td>\n",
       "      <td>2013-01-31</td>\n",
       "      <td>221.0</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>2013-01-03</td>\n",
       "      <td>2013-01-28</td>\n",
       "      <td>347.0</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>2013-01-31</td>\n",
       "      <td>2013-01-31</td>\n",
       "      <td>247.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>2013-01-31</td>\n",
       "      <td>2013-01-31</td>\n",
       "      <td>221.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51</th>\n",
       "      <td>2013-01-13</td>\n",
       "      <td>2013-01-31</td>\n",
       "      <td>128.5</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61</th>\n",
       "      <td>2013-01-10</td>\n",
       "      <td>2013-01-10</td>\n",
       "      <td>195.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75</th>\n",
       "      <td>2013-01-17</td>\n",
       "      <td>2013-01-17</td>\n",
       "      <td>76.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>88</th>\n",
       "      <td>2013-01-16</td>\n",
       "      <td>2013-01-16</td>\n",
       "      <td>76.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>2013-01-06</td>\n",
       "      <td>2013-01-06</td>\n",
       "      <td>193.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>96</th>\n",
       "      <td>2013-01-10</td>\n",
       "      <td>2013-01-10</td>\n",
       "      <td>70.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>98</th>\n",
       "      <td>2013-01-04</td>\n",
       "      <td>2013-01-31</td>\n",
       "      <td>268.0</td>\n",
       "      <td>25.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>111</th>\n",
       "      <td>2013-01-17</td>\n",
       "      <td>2013-01-17</td>\n",
       "      <td>89.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>149</th>\n",
       "      <td>2013-01-11</td>\n",
       "      <td>2013-01-28</td>\n",
       "      <td>99.0</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>151</th>\n",
       "      <td>2013-01-16</td>\n",
       "      <td>2013-01-16</td>\n",
       "      <td>75.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>153</th>\n",
       "      <td>2013-01-09</td>\n",
       "      <td>2013-01-09</td>\n",
       "      <td>258.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>198</th>\n",
       "      <td>2013-01-10</td>\n",
       "      <td>2013-01-10</td>\n",
       "      <td>112.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>210</th>\n",
       "      <td>2013-01-05</td>\n",
       "      <td>2013-01-25</td>\n",
       "      <td>118.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>282</th>\n",
       "      <td>2013-01-04</td>\n",
       "      <td>2013-01-04</td>\n",
       "      <td>109.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>306</th>\n",
       "      <td>2013-01-22</td>\n",
       "      <td>2013-01-22</td>\n",
       "      <td>59.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>351</th>\n",
       "      <td>2013-01-21</td>\n",
       "      <td>2013-01-21</td>\n",
       "      <td>89.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                     date            item_price item_cnt_day\n",
       "                                      min        max       mean          sum\n",
       "date_block_num shop_id item_id                                              \n",
       "0              0       32      2013-01-03 2013-01-31      221.0          6.0\n",
       "                       33      2013-01-03 2013-01-28      347.0          3.0\n",
       "                       35      2013-01-31 2013-01-31      247.0          1.0\n",
       "                       43      2013-01-31 2013-01-31      221.0          1.0\n",
       "                       51      2013-01-13 2013-01-31      128.5          2.0\n",
       "                       61      2013-01-10 2013-01-10      195.0          1.0\n",
       "                       75      2013-01-17 2013-01-17       76.0          1.0\n",
       "                       88      2013-01-16 2013-01-16       76.0          1.0\n",
       "                       95      2013-01-06 2013-01-06      193.0          1.0\n",
       "                       96      2013-01-10 2013-01-10       70.0          1.0\n",
       "                       98      2013-01-04 2013-01-31      268.0         25.0\n",
       "                       111     2013-01-17 2013-01-17       89.0          1.0\n",
       "                       149     2013-01-11 2013-01-28       99.0          3.0\n",
       "                       151     2013-01-16 2013-01-16       75.0          1.0\n",
       "                       153     2013-01-09 2013-01-09      258.0          1.0\n",
       "                       198     2013-01-10 2013-01-10      112.0          1.0\n",
       "                       210     2013-01-05 2013-01-25      118.0          2.0\n",
       "                       282     2013-01-04 2013-01-04      109.0          1.0\n",
       "                       306     2013-01-22 2013-01-22       59.0          1.0\n",
       "                       351     2013-01-21 2013-01-21       89.0          1.0"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "monthly_sales=sales.groupby([\"date_block_num\",\"shop_id\",\"item_id\"])[\n",
    "    \"date\",\"item_price\",\"item_cnt_day\"].agg({\"date\":[\"min\",'max'],\"item_price\":\"mean\",\"item_cnt_day\":\"sum\"})\n",
    "monthly_sales.head(20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# TIME SERIES\n",
    "from statsmodels.tsa.arima_model import ARIMA\n",
    "from statsmodels.tsa.statespace.sarimax import SARIMAX\n",
    "from pandas.plotting import autocorrelation_plot\n",
    "from statsmodels.tsa.stattools import adfuller, acf, pacf,arma_order_select_ic\n",
    "import statsmodels.formula.api as smf\n",
    "import statsmodels.tsa.api as smt\n",
    "import statsmodels.api as sm\n",
    "import scipy.stats as scs\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nJEmSJEm9sfgkSZIkSZKk3lh8kiRJkiRJUm8sPkmSJEmSJKk3Fp8kSZIkSZLUG4tPkiRJkiRJ6o3F\nJ0mSJEmSJPVmZMWniLg2In4eEZdGxIJy2QYRcXZEXFP+Xr9cHhFxTEQsjIjLI2LrgefZp2x/TUTs\nM6rxS5IkSZIkaXijPvJph8x8dmZuU94/BJifmVsB88v7ALsAW5U/+wOfhaJYBRwGPA/YFjhsrGAl\nSZIkSZKkiWfaKu5/LrB9eXsecB7wnnL5VzIzgZ9FxHoRsUnZ9uzMXAoQEWcDOwMnjHbYkiTpkebg\n+ad3bnv0nFf1OBJJkqTJZZRHPiVwVkRcFBH7l8s2yszFAOXvDcvls4DrB2IXlcvqli8jIvaPiAUR\nsWDJkiUreTUkSZIkSZLU1SiPfPqbzLwxIjYEzo6IXzS0jYpl2bB82QWZXwC+ALDNNtss97gkSZIk\nSZJGY2RHPmXmjeXvW4BvUVyz6ebydDrK37eUzRcBmw+Ebwbc2LBckiRJkiRJE9BIik8R8ZiIeNzY\nbWAn4ArgdGDsG+v2AU4rb58OvLH81rvnA3eWp+WdCewUEeuXFxrfqVwmSZIkSZKkCWhUp91tBHwr\nIsb6/Hpm/iAiLgROjoj9gN8Bu5ftvwe8DFgI/B7YFyAzl0bEB4ELy3YfGLv4uCRJkiRJkiaekRSf\nMvM3wLMqlt8GzKlYnsDbap7rOOC4lT1GSZIkSZIkrXyj/LY7SZIkSZIkPcJYfJIkSZIkSVJvLD5J\nkiRJkiSpNxafJEmSJEmS1BuLT5IkSZIkSeqNxSdJkiRJkiT1xuKTJEmSJEmSemPxSZIkSZIkSb2x\n+CRJkiRJkqTeWHySJEmSJElSbyw+SZIkSZIkqTcWnyRJkiRJktQbi0+SJEmSJEnqjcUnSZIkSZIk\n9cbikyRJkiRJknpj8UmSJEmSJEm9sfgkSZIkSZKk3lh8kiRJkiRJUm8sPkmSJEmSJKk3Fp8kSZIk\nSZLUG4tPkiRJkiRJ6o3FJ0mSJEmSJPXG4pMkSZIkSZJ6Y/FJkiRJkiRJvbH4JEmSJEmSpN5YfJIk\nSZIkSVJvLD5JkiRJkiSpNxafJEmSJEmS1BuLT5IkSZIkSeqNxSdJkiRJkiT1xuKTJEmSJEmSemPx\nSZIkSZIkSb0ZafEpIlaPiEsi4ozy/hMi4vyIuCYiToqINcvla5X3F5aPzx54jveWy38ZES8d5fgl\nSZIkSZI0nFEf+XQQcPXA/Y8CR2XmVsDtwH7l8v2A2zNzS+Cosh0R8XRgT+AvgJ2Bz0TE6iMauyRJ\nkiRJkoY0suJTRGwGvBw4trwfwI7AKWWTecCu5e255X3Kx+eU7ecCJ2bmfZn5W2AhsO1o1kCSJEmS\nJEnDGuWRT0cD7wYeLO9PB+7IzPvL+4uAWeXtWcD1AOXjd5btH1peEfOQiNg/IhZExIIlS5as7PWQ\nJEmSJElSRyMpPkXEK4BbMvOiwcUVTbPlsaaYPy/I/EJmbpOZ28ycOXPo8UqSJEmSJGnlmDaifv4G\neFVEvAx4FLAOxZFQ60XEtPLops2AG8v2i4DNgUURMQ1YF1g6sHzMYIwkSZIkSZImmJEc+ZSZ783M\nzTJzNsUFw8/JzL2Ac4Hdymb7AKeVt08v71M+fk5mZrl8z/Lb8J4AbAVcMIp1kCRJkiRJ0vBGdeRT\nnfcAJ0bEh4BLgC+Vy78EfDUiFlIc8bQnQGZeGREnA1cB9wNvy8wHRj9sSZIkSZIkdTHy4lNmngec\nV97+DRXfVpeZ9wK718QfARzR3wglSZIkSZK0sozy2+4kSZIkSZL0CGPxSZIkSZIkSb2x+CRJkiRJ\nkqTeWHySJEmSJElSbyw+SZIkSZIkqTcWnyRJkiRJktQbi0+SJEmSJEnqjcUnSZIkSZIk9cbikyRJ\nkiRJknpj8UmSJEmSJEm9sfgkSZIkSZKk3lh8kiRJkiRJUm8sPkmSJEmSJKk3Fp8kSZIkSZLUG4tP\nkiRJkiRJ6o3FJ0mSJEmSJPXG4pMkSZIkSZJ6Y/FJkiRJkiRJvbH4JEmSJEmSpN5YfJIkSZIkSVJv\nVqj4FBFPjIgtVvZgJEmSJEmSNLV0Kj5FxAkR8dfl7X2BK4GrImK/PgcnSZIkSZKkya3rkU9zgAXl\n7XcALwG2BQ7pY1CSJEmSJEmaGqZ1bLdmZv4xImYBG2Tm/wBExEb9DU2SJEmSJEmTXdfi06UR8V5g\nC+C7AGUh6q6+BiZJkiRJkqTJr+tpd/sBfwmsDfxbuWw74Gt9DEqSJEmSJElTQ6cjnzLz18Drxy07\nBTilj0FJkiRJkiRpauh62h0R8ULgOcBjB5dn5odX9qAkSZIkSZI0NXQqPkXEJ4E9gP8G/jDwUPYx\nKEmSJEmSJE0NXY982gt4Rmbe2OdgJEmSJEmSNLV0veD49cB9fQ5EkiRJkiRJU0/XI5/2A74YEScA\n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\nnKiLq82LhpjavKiLacqJhn7acqK2r7q8aOirNicaYtpyoi6uNi+oeT8GngCcX+bEScCaHWIOoNjn\nLPc32BL3tXLbXUGR12t0iPlSuexyivfqx7bFDDz+SeCejmP7MvDbgdfq2R3jAjgC+FX5ehzYIea/\nB/q5Efh2h5g5wMVlzE+ALTv7OsVWAAAVSElEQVSOb8cy7gpgHjCt4vVaZn/blBMNMY05URNTmw8N\nMbX50BTXlBMNfTXmRE1MbT60xNXmRENMY07UxHTJh2sZN5eifT5RFdO276iKaZxPNMQ1zimqYgYe\nq5tPVPVzOM37jsp+aJ9PVPXVNp+oimnbd1TFNM4nyjbLzZU75ERVTFtOVMW0zTGrYrrMMWvn/w05\nUdVXW05U9tOUEzX9NOZDQ1xbTlTFNM0lKj8DdciHurjanGiIaZpf1sW0vUc0fraryomGvmpzoqmf\nupxo6KftPaIurjYnGmLaPncs9xmXlrlETUyXuURVXON8oiam03yi6WeoxlPhh2JS8WvgicCa5QZ8\neoe4FwFbM1zxaRNg6/L24ygmVo19UUzCHlveXqNMwOd37O8dwNcZvvhUmagNMfOAN5W316RiotPh\nNbgJ2KKl3SyKSeza5f2Tgb9viXlG+UfyaIoL6v8Q2Krrawr8B2VBEjgE+GiHmKeVbzznUT0xqIrZ\niXICC3y0Yz+DO7IDgc91zVOKD95nAteNf71r+joceNcwfw/ADuX2Xqu8v2HX8Q08/nHg0A59nQXs\nUt5+GXBeh5gLgReXt/8B+OC4mMq/16acaIhpy4m6uNq8aIipzYu6mKacaOinLSfq4mrzoml8dTnR\n0E9bTtTF1eYFNe/HFO9Fe5bLPwe8tUPMc4DZ1LznNsS9rHwsKHb+XfoazIkjGfgnS11MeX8b4Kss\nX3yq6+fLwG4NOVEXty/wFWC1ipxo3QcCpwJv7NDPr4Cnlcv/Cfhyh/H9NXA98ORy+QeA/SrWbZn9\nbVNONMQ05kRNTG0+NMTU5kNTXFNONPTVmBM1MbX50Da+upxo6KsxJ8bHUJwh0CUflnsNaZ9PVMW0\n7TuqYhrnEw1xjXOKurykeT5R1c/hNO87qmK6zCcqxzfweNV8oqqvtn1HVUzjfKJcvtxcuUNOVMW0\n5URVTNscsyqmyxyzcv7fkhNVfbXlRFVMY07Uja0pHxr6asuJqpjWnCgfe+gzUFs+NMQ15kRNTOv7\nREVMa05UxbXlRE1fjTlRE9P6PlE1tracqOmrMSdqYprml5WfcWmeX9bFtM0v6+Ka5pd1MZ3mE00/\nj8TT7rYFFmbmbzLzj8CJwNy2oMz8MbB0mI4yc3FmXlzevpuiOj6rJSYz857y7hrlT7b1FRGbAS8H\njh1mjMOKiHUoPth/CSAz/5iZdwz5NHOAX2fmdR3aTgPWjohpFAWlG1vaPw34WWb+PjPvB34EvLqq\nYc1rOpdip0L5e9e2mMy8OjN/WTegmpizyvFBUUnfrEPMXQN3H0NFXjTk6VHAu4eMqVUT81bgI5l5\nX9nmlmH6iogA9qB4A2yLSWCd8va6jMuLmpinAD8ub58NvGZcTN3fa21O1MV0yIm6uNq8aIipzYuW\n96DKnFiR962WuNq8aOurKicaYtpyoi6uNi8a3o93pPiPDyyfE5UxmXlJZl7bsP3q4r5XPpYUR+ls\n1iHmroHttzbL5kRlTESsTvGf0Xd3HVvdunSIeyvwgcx8sGx3S4cYynV6HMX2/3aHmLacqIp7ALgv\nM39VLl/uvWL8/rbczrU5URVT9t+YEzUxtfnQEFObD01xTTlRF9OmJqY2H7r0VZUTDTGNOVERM52W\nfGjQOJ+o0rbvqIlpnE80xLXOKWrUzidWotb5RJO6+USNxpyo0TifaJgr1+ZEXUxTTjTE1OZEQ0xj\nPrTM/ytzYkU+MzTE1OZEWz91+dAQV5sTDTGNOTFg8DPQMO8RD8UN8T4xGNP1fWIwZpj3iPGf7bq8\nTwzzebAqpuv7xHL9dHyPGIzr+j4xGNOWE+M/4y6mZS5REXNj21yiIa5xPlET0zqfaPNILD7Novgv\n1phFdPhg9XBFxGyKyuT5HdquHhGXUpw2dHZmtsYAR1P8kT845NASOCsiLoqI/Tu0fyKwBPiviLgk\nIo6NiMcM2eeedJgQZOYNwH8Cv6P4g7wzM89qCbsCeFFETI+IR1NUdTcfYmwbZebisv/FwIZDxK6o\nfwC+36VhRBwREdcDewGHdox5FXBDZl425LgOiIjLI+K4iFi/Q/snAy+MiPMj4kcR8VdD9vdC4ObM\nvKZD24OBj5Xb4j+B93aIuQJ4VXl7dxryYtzfa6ecGOZvvGNcbV6Mj+mSF4MxXXOiYmydcmJcXKe8\nqNkOjTkxLqZzToyLa8yL8e/HFEfO3jEwiVtuH7KC7+GNcRGxBrA38IMuMRHxXxT/fXsqxWlTbTEH\nAKeP5foQYzuizImjImKtjnFPAl4bEQsi4vsRsVXX7UDxz4T54ybFdTFvAr4XEYvKbfeRtvFRTMDW\niIhtyia7sfx7xfj97XRacqIipovamLp8qItpyoeGuMacaBhfU05UxTTmQ0tfUJMTNTFtOTE+5lba\n8wGq51Jt+45h519dYur2G5VxLfuO5WI67Dvqxte076iK6bLfaNoWdfuOqpi2fUdVTNt8om6u3JQT\nKzK/7hIzPidqY1ryoTKuJSeaxleXE3UxTTnRth3q8qEurikn6mK6zjEHPwMN85mj02enjjFNnzuW\niWnJicq4rnPMivF1mWMOxnT93FG1Hbp85hiM6zrHHIypzYmqz7jARTTMJVbwc3FrXNV8oimmw3yi\ndUCPqB+KF//Ygft7A5/sGDubIU67G4h7LEVC/d2QcetRXKPkGS3tXgF8pry9PcOddrdp+XtDilMQ\nX9TSfhvgfuB55f1PUHNoaU38mhSTuY06tF0fOAeYSfEf6W8Db+gQtx/F9Rl+THHI4lFdX1OKP/rB\nx2/vmgc0HP7aEPOvFOdexzD5RvGmV3k9sME4ikr1+cC65f1rqT4kc/x22Iji0NHVKK7FcVyHmCuA\nYygO39yW4nDNzusFfBZ4Z8fX6RjgNeXtPYAfdoh5KsVhsxcBhwG31fS1zN9rx5yo/BtvyomWuKa8\nqH0/qcuLwZghcmL8dmjNiZq41rxo2A5NOTG+n9acqInrmhdj78cvpDh6dmz55sDPW2KeMbCscnt3\niPsicPSQMasDnwH2bYl5EcX1b8YOya88xWp8PxSnMgawFsV/6JoOXx+Mu2fsdS1z8r+HWKfvj73O\nHfr5Jn/eV/0LA/v+lrjtKK4ndAHwIeCSgXbL7W8p9lG1OVEVM67v5XKiQ8xy+dAhpjIfatZp06ac\nqOurKScaYhrzocN6LZcTDX3V5kRDTG0+DMQuN5eiZd9RFTPw2HlUn2LVFNO032ic61Gx76hZp8Z9\nR01M476jJqbLfqNpW1TuO2r6atx31MQ07jeomSs35URdTFNOdIhZLifaYhryoSruY0050bAdanOi\nIaY2Jzpsh7p8qOurNicaYlrnEoz7DNSUD01xbe8TLTFN7xO1n9GqcqIqju5zzPHbosvnjvExXd4n\n6rZD7fyypq8unzvGx9TmBNWfcfemeS7R+Lm4YVu3xVXNJ9piGueXTT9DNZ4KPxSTiDPH/TG9t2Ps\nbIYsPpUv2JnAO1ZwvIfRcg4s8O8U1dFrKSqRvweOX4G+Du/Q18bAtQP3Xwh8d4g+5gJndWy7O/Cl\ngftvpJwYDtHfh4F/6vqaUlx4bZPy9ibAL7vmAUMWn4B9KC5E9+hh843iXOK6xx6KA/6S4j/615Y/\n91NUsTceoq+69R2/7X4AbD9w/9fAzI7bYhpwM7BZx9fpTv486QjgriG335OBCyqWL/f32pYTVTEd\nc6Iyrikvmvqqy4vxMV1yokM/dTlRtf0a86JhO9TmRE0/XXKibb0q82Lg8cMoPrDeyp8/lC+zT6mJ\nedfA/WvpcJ29wbjy9rcpr4nTta9y2Ytp+IdEGXMYxb5jLCceZGAC1LGf7Zv6GYyjuOjp7IHX6s6O\n22E6cBstXzwx8Dr9emDZ44GrVmD77QScPHC/an/7taacqIk5fuDx5XKiKaYuH9r6qcuHmrjbm3Ki\nY1/L5ERdTFs+tGyLypyoifluU050XKdl8qEmjw6nyPPW+cT4mIH759Hwj4vxMbTMJ5r6KpfVzikG\nYv4fHeYTLf3M7tDPu+g4n6jZFo3ziYq+WvcdLeu03H6DmrlyU07UxTTlRFNMXU609VOXDzVx85ty\nomNfy+REw7arzYmW7dA0l6jrqzYnOq5T3Rxzmc9ATfnQFNeUE00xdTnR1k9dTlTF0f1zR1Nfs6v6\nqth+re8TNduh9T2ioq8uc8ymdVomJ6j+jPtZmucSjZ+LqS8+1cZRP59o/QxOy/yy7ueReNrdhcBW\nEfGEiFiT4vC40/voKCKC4pzgqzPzyI4xMyNivfL22sBLKCZmtTLzvZm5WWbOplifczLzDR36ekwU\n10qgPGR0J4oqclNfNwHXR8RTykVzgKva+hrwOrofNvo74PkR8ehyW86huE5Lo4jYsPz9eIr/og5z\nmOrpFG/OlL9PGyK2s4jYGXgP8KrM/H3HmMFTEV5FS14AZObPM3PDzJxd5sciiosu39TS1yYDd19N\nS16Uvk1xrjIR8WT+/B+ALl4C/CIzF3VsfyPFmx5ln62n6g3kxWrAv1EcFTf4eN3fa21OrMjfeFNc\nU140xNTmRVVMW0409NOYEw3bojYvWrZfZU40xDTmRMN61eZFzfvx1RRHyOxWNhufE0O/hzfFRcSb\ngJcCr8vymjgtMb+MiC0H1vmVLJsTVTEXZebGAznx+8zcssPYNhnoZ1eWz4m6bfFQTlC8Zr/qEAPF\nZOiMzLy3Qz9XA+uWOQfwt4zbfzSs11hOrEXx9/hQTtTsb/eiISdWZB9dF9OUD1UxwN5N+dDQ1/pN\nOdEwvtqcaNgOtfnQYftV5kTNtphLQ040rFNtPpTL6+ZSTfuOoedfdTFt84mGuKZ9R1XMhS37jrp+\navcdDduhcT7Rsv3q9h11MbX7joZ1apxPNMyVa3NiRebXdTFNOdEQ0zjHrIm7uCknGvqqzYmG7VCb\nEy3brnZ+2RBXmxMN69SYE6Xxn4G6fuYY5rNTZUzb+0RNTNfPHQ/FDfG5Y3xfXT53jN8OXT53VG27\nLp85xsd1+dwxfp2acqLqM+5VNMwlamJaPxfXxTXNJxpiGucTnQxbrZoKPxTXAfoVRYX0XzvGnEBx\nzuOfKP6Qlvu2k4qYF1CcKz72NZXLfHVkTcwzKb7i93KKP7za0xhq4renYxWS4rzly/jz10x33RbP\npviaycsp/vDX7xj3aIr/UK47xPq8v0zsKyi+cWetDjH/TfEHfBkwZ5jXlOK/qPMp3lTmAxt0iHl1\nefs+ikr6mR1iFlJce2wsL8Z/y0xVzKnldric4is7Zw2bp1T/h72qr69SfDXo5RQ7x006xKxJ8V/s\nKyhOe9yx6/goviHpLUO8Ti+gOIz1MorDe5/bIeYgir/7X1Fc52P8obmVf69NOdEQ05YTdXG1edEQ\nU5sXdTFNOdHQT1tO1MXV5kXT+OpyoqGftpyoi6vNC2rejyneOy8oX69vMPC+1BBzYJkT91NMYo4d\nN766uPsp9lVjYz60KYbikPX/KV+rKyiOylmnrZ9xYxl/ilXd2M4Z6Od4xn3lbkPcehT/Xf45xX9h\nn9VlfBT/5d25Yrx1/by67OOyMvaJHeM+RjGh+yUDXxtd0e/2/PnUrNqcaIhpzImamNp8qIppy4em\nvppyomF8jTlRE1ObD23jq8uJhr4ac6ImpjEfqJlL0bzvqIup3Xc0xLTNJ+rimvYdrfNDlt931PVT\nu+9oiGmcTzSNj/p9R11ftfuOhpjG+UTZZrm5clNONMS0zSeqYtpyoiqmyxyzcf4/Pica+mqbT1TF\ntOVE5djq8qGlr7b5RFVM2xxzuc9AbfnQENeWE1UxbTlRFdMlJxo/29XkRFVfbTlRFdOWE5Vj65AT\nVX215URVTFtOLPcZl5a5RE1M61yiJq5xPlET03k+UfczdviYJEmSJEmStNI9Ek+7kyRJkiRJ0ohY\nfJIkSZIkSVJvLD5JkiRJkiSpNxafJEmSJEmS1BuLT5IkSZIkSeqNxSdJkiRJkiT1xuKTJElSBxHx\n+ohYEBH3RMTiiPh+RLygQ1xGxJajGKMkSdJEZPFJkiSpRUS8Azga+DCwEfB44DPA3FU5riYRMW1V\nj0GSJAksPkmSJDWKiHWBDwBvy8xvZub/ZeafMvM7mfkvEbFtRPw0Iu4oj4j6VESsWcb+uHyay8oj\npl5bLn9FRFxaxvxvRDxzoL+tI+KSiLg7Ir4RESdFxIcGHn9zRCyMiKURcXpEbDrwWEbE2yLiGuCa\niPh0RHx83Pp8JyIO7m+LSZIkLcvikyRJUrPtgEcB36p5/AHg7cCMsu0c4J8AMvNFZZtnZeZjM/Ok\niNgaOA74R2A68Hng9IhYqyxafQv4MrABcALw6rGOImJH4N+BPYBNgOuAE8eNZ1fgecDTgXnA6yJi\ntTJ+Rjm+E1ZkQ0iSJK0Ii0+SJEnNpgO3Zub9VQ9m5kWZ+bPMvD8zr6UoJr244fneDHw+M8/PzAcy\ncx5wH/D88mcacEx5dNU3gQsGYvcCjsvMizPzPuC9wHYRMXugzb9n5tLM/ENmXgDcSVFwAtgTOC8z\nbx5qC0iSJD0MFp8kSZKa3QbMqLuGUkQ8OSLOiIibIuIuiutCzWh4vi2Ad5an3N0REXcAmwOblj83\nZGYOtL9+4PamFEc7AZCZ95Tjm1XTHoqjn95Q3n4D8NWGsUmSJK10Fp8kSZKa/RS4l+J0tiqfBX4B\nbJWZ6wDvA6Lh+a4HjsjM9QZ+Hp2ZJwCLgVkRMRi/+cDtGymKVwBExGMojsy6YaDNYOEK4HhgbkQ8\nC3ga8O2GsUmSJK10Fp8kSZIaZOadwKHApyNi14h4dESsERG7RMR/AI8D7gLuiYinAm8d9xQ3A08c\nuP9F4C0R8bwoPCYiXh4Rj6ModD0AHBAR0yJiLrDtQOzXgX0j4tkRsRbFUVbnl6f71Y1/EXAhxRFP\np2bmH1Z8a0iSJA3P4pMkSVKLzDwSeAfwb8ASiqOXDqA4iuhdwOuBuykKSyeNCz8cmFeeYrdHZi6g\nuO7Tp4DbgYXA35f9/BH4O2A/4A6K0+TOoLgmFJk5H/h/wKkUR0k9ieI6Tm3mAX+Jp9xJkqRVIJa9\npIAkSZImkog4H/hcZv7Xw3iOF1Gcfjc7Mx9caYOTJEnqwCOfJEmSJpCIeHFEbFyedrcP8EzgBw/j\n+dYADgKOtfAkSZJWhcpvbZEkSdIq8xTgZOCxwK+B3TJz8Yo8UUQ8DVgAXAbsu9JGKEmSNARPu5Mk\nSZIkSVJvPO1OkiRJkiRJvbH4JEmSJEmSpN5YfJIkSZIkSVJvLD5JkiRJkiSpNxafJEmSJEmS1Jv/\nD4bqi7q+XBuQAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10d848410>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# number of items per cat \n",
    "x=item.groupby(['item_category_id']).count()\n",
    "x=x.sort_values(by='item_id',ascending=False)\n",
    "x=x.iloc[0:].reset_index()\n",
    "# #plot\n",
    "plt.figure(figsize=(20,4))\n",
    "ax= sns.barplot(x.item_category_id, x.item_id, alpha=0.8)\n",
    "plt.title(\"Items per Category\")\n",
    "plt.ylabel('# of items', fontsize=12)\n",
    "plt.xlabel('Category', fontsize=12)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nrkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10d982490>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ts=sales.groupby([\"date_block_num\"])[\"item_cnt_day\"].sum()\n",
    "ts.astype('float')\n",
    "res = sm.tsa.seasonal_decompose(ts.values,freq=12,model=\"multiplicative\")\n",
    "#plt.figure(figsize=(16,12))\n",
    "fig = res.plot()\n",
    "fig.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10d964810>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Additive model\n",
    "res = sm.tsa.seasonal_decompose(ts.values,freq=12,model=\"additive\")\n",
    "#plt.figure(figsize=(16,12))\n",
    "fig = res.plot()\n",
    "#fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from rpy2.robjects import r\n",
    "def decompose(series, frequency, s_window, **kwargs):\n",
    "    df = pd.DataFrame()\n",
    "    df['date'] = series.index\n",
    "    s = [x for x in series.values]\n",
    "    length = len(series)\n",
    "    s = r.ts(s, frequency=frequency)\n",
    "    decomposed = [x for x in r.stl(s, s_window, **kwargs).rx2('time.series')]\n",
    "    df['observed'] = series.values\n",
    "    df['trend'] = decomposed[length:2*length]\n",
    "    df['seasonal'] = decomposed[0:length]\n",
    "    df['residual'] = decomposed[2*length:3*length]\n",
    "    return df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Results of Dickey-Fuller Test:\n",
      "Test Statistic                 -2.395704\n",
      "p-value                         0.142953\n",
      "#Lags Used                      0.000000\n",
      "Number of Observations Used    33.000000\n",
      "Critical Value (5%)            -2.954127\n",
      "Critical Value (1%)            -3.646135\n",
      "Critical Value (10%)           -2.615968\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "# Stationarity tests\n",
    "def test_stationarity(timeseries):\n",
    "    \n",
    "    #Perform Dickey-Fuller test:\n",
    "    print('Results of Dickey-Fuller Test:')\n",
    "    dftest = adfuller(timeseries, autolag='AIC')\n",
    "    dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])\n",
    "    for key,value in dftest[4].items():\n",
    "        dfoutput['Critical Value (%s)'%key] = value\n",
    "    print (dfoutput)\n",
    "\n",
    "test_stationarity(ts)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# to remove trend\n",
    "from pandas import Series as Series\n",
    "# create a differenced series\n",
    "def difference(dataset, interval=1):\n",
    "    diff = list()\n",
    "    for i in range(interval, len(dataset)):\n",
    "        value = dataset[i] - dataset[i - interval]\n",
    "        diff.append(value)\n",
    "    return Series(diff)\n",
    "\n",
    "# invert differenced forecast\n",
    "def inverse_difference(last_ob, value):\n",
    "    return value + last_ob"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Results of Dickey-Fuller Test:\n",
      "Test Statistic                 -3.270101\n",
      "p-value                         0.016269\n",
      "#Lags Used                      0.000000\n",
      "Number of Observations Used    21.000000\n",
      "Critical Value (5%)            -3.013098\n",
      "Critical Value (1%)            -3.788386\n",
      "Critical Value (10%)           -2.646397\n",
      "dtype: float64\n"
     ]
    }
   ],
   "source": [
    "ts=sales.groupby([\"date_block_num\"])[\"item_cnt_day\"].sum()\n",
    "new_ts=difference(ts,12)       # assuming the seasonality is 12 months long\n",
    "\n",
    "test_stationarity(new_ts)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def tsplot(y, lags=None, figsize=(10, 8), style='bmh',title=''):\n",
    "    if not isinstance(y, pd.Series):\n",
    "        y = pd.Series(y)\n",
    "    with plt.style.context(style):    \n",
    "        fig = plt.figure(figsize=figsize)\n",
    "        #mpl.rcParams['font.family'] = 'Ubuntu Mono'\n",
    "        layout = (3, 2)\n",
    "        ts_ax = plt.subplot2grid(layout, (0, 0), colspan=2)\n",
    "        acf_ax = plt.subplot2grid(layout, (1, 0))\n",
    "        pacf_ax = plt.subplot2grid(layout, (1, 1))\n",
    "        qq_ax = plt.subplot2grid(layout, (2, 0))\n",
    "        pp_ax = plt.subplot2grid(layout, (2, 1))\n",
    "        \n",
    "        y.plot(ax=ts_ax)\n",
    "        ts_ax.set_title(title)\n",
    "        smt.graphics.plot_acf(y, lags=lags, ax=acf_ax, alpha=0.5)\n",
    "        smt.graphics.plot_pacf(y, lags=lags, ax=pacf_ax, alpha=0.5)\n",
    "        sm.qqplot(y, line='s', ax=qq_ax)\n",
    "        qq_ax.set_title('QQ Plot')        \n",
    "        scs.probplot(y, sparams=(y.mean(), y.std()), plot=pp_ax)\n",
    "\n",
    "        plt.tight_layout()\n",
    "    return "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "aic: 472.99703 | order: (1, 1)\n"
     ]
    }
   ],
   "source": [
    "#\n",
    "# pick best order by aic \n",
    "# smallest aic value wins\n",
    "best_aic = np.inf \n",
    "best_order = None\n",
    "best_mdl = None\n",
    "\n",
    "rng = range(5)\n",
    "for i in rng:\n",
    "    for j in rng:\n",
    "        try:\n",
    "            tmp_mdl = smt.ARMA(new_ts.values, order=(i, j)).fit(method='mle', trend='nc')\n",
    "            tmp_aic = tmp_mdl.aic\n",
    "            if tmp_aic < best_aic:\n",
    "                best_aic = tmp_aic\n",
    "                best_order = (i, j)\n",
    "                best_mdl = tmp_mdl\n",
    "        except: continue\n",
    "\n",
    "\n",
    "print('aic: {:6.5f} | order: {}'.format(best_aic, best_order))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>index</th>\n",
       "      <th>item_cnt_day</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2013-01-01</td>\n",
       "      <td>131479.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2013-02-01</td>\n",
       "      <td>128090.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2013-03-01</td>\n",
       "      <td>147142.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2013-04-01</td>\n",
       "      <td>107190.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2013-05-01</td>\n",
       "      <td>106970.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       index  item_cnt_day\n",
       "0 2013-01-01      131479.0\n",
       "1 2013-02-01      128090.0\n",
       "2 2013-03-01      147142.0\n",
       "3 2013-04-01      107190.0\n",
       "4 2013-05-01      106970.0"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# adding the dates to the Time-series as index\n",
    "ts=sales.groupby([\"date_block_num\"])[\"item_cnt_day\"].sum()\n",
    "ts.index=pd.date_range(start = '2013-01-01',end='2015-10-01', freq = 'MS')\n",
    "ts=ts.reset_index()\n",
    "ts.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## First Predictions Using Prophet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:fbprophet.forecaster:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this.\n",
      "INFO:fbprophet.forecaster:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ds</th>\n",
       "      <th>yhat</th>\n",
       "      <th>yhat_lower</th>\n",
       "      <th>yhat_upper</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>2015-11-01</td>\n",
       "      <td>81571.606518</td>\n",
       "      <td>78526.052741</td>\n",
       "      <td>84642.145017</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>2015-12-01</td>\n",
       "      <td>127712.246513</td>\n",
       "      <td>124717.443697</td>\n",
       "      <td>130642.956045</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>2016-01-01</td>\n",
       "      <td>76107.720590</td>\n",
       "      <td>73085.001002</td>\n",
       "      <td>79144.334641</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>2016-02-01</td>\n",
       "      <td>40946.574039</td>\n",
       "      <td>38022.793404</td>\n",
       "      <td>43706.346171</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>2016-03-01</td>\n",
       "      <td>77514.329123</td>\n",
       "      <td>74557.945891</td>\n",
       "      <td>80409.521282</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           ds           yhat     yhat_lower     yhat_upper\n",
       "34 2015-11-01   81571.606518   78526.052741   84642.145017\n",
       "35 2015-12-01  127712.246513  124717.443697  130642.956045\n",
       "36 2016-01-01   76107.720590   73085.001002   79144.334641\n",
       "37 2016-02-01   40946.574039   38022.793404   43706.346171\n",
       "38 2016-03-01   77514.329123   74557.945891   80409.521282"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from fbprophet import Prophet\n",
    "#prophet reqiures a pandas df at the below config \n",
    "# ( date column named as DS and the value column as Y)\n",
    "ts.columns=['ds','y']\n",
    "model = Prophet( yearly_seasonality=True) #instantiate Prophet with only yearly seasonality as our data is monthly \n",
    "model.fit(ts) #fit the model with your dataframe\n",
    "# predict for five months in the furure and MS - month start is the frequency\n",
    "future = model.make_future_dataframe(periods = 5, freq = 'MS')  \n",
    "# now lets make the forecasts\n",
    "forecast = model.predict(future)\n",
    "forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2013-01-01    131479.0\n",
       "2013-02-01    128090.0\n",
       "2013-03-01    147142.0\n",
       "2013-04-01    107190.0\n",
       "2013-05-01    106970.0\n",
       "Freq: MS, Name: item_cnt_day, dtype: float64"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "total_sales=sales.groupby(['date_block_num'])[\"item_cnt_day\"].sum()\n",
    "dates=pd.date_range(start = '2013-01-01',end='2015-10-01', freq = 'MS')\n",
    "\n",
    "total_sales.index=dates\n",
    "total_sales.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th>shop_id</th>\n",
       "      <th>index</th>\n",
       "      <th colspan=\"9\" halign=\"left\">0</th>\n",
       "      <th>...</th>\n",
       "      <th colspan=\"10\" halign=\"left\">59</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>item_id</th>\n",
       "      <th></th>\n",
       "      <th>30</th>\n",
       "      <th>31</th>\n",
       "      <th>32</th>\n",
       "      <th>33</th>\n",
       "      <th>35</th>\n",
       "      <th>36</th>\n",
       "      <th>40</th>\n",
       "      <th>42</th>\n",
       "      <th>43</th>\n",
       "      <th>...</th>\n",
       "      <th>22144</th>\n",
       "      <th>22145</th>\n",
       "      <th>22150</th>\n",
       "      <th>22151</th>\n",
       "      <th>22153</th>\n",
       "      <th>22154</th>\n",
       "      <th>22155</th>\n",
       "      <th>22162</th>\n",
       "      <th>22164</th>\n",
       "      <th>22167</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2013-01-01</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2013-02-01</td>\n",
       "      <td>31.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>14.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2013-03-01</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2013-04-01</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2013-05-01</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 424125 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "shop_id      index     0                                             ...   \\\n",
       "item_id               30    31    32   33    35   36   40   42   43  ...    \n",
       "0       2013-01-01   0.0   0.0   6.0  3.0   1.0  0.0  0.0  0.0  1.0  ...    \n",
       "1       2013-02-01  31.0  11.0  10.0  3.0  14.0  1.0  1.0  1.0  0.0  ...    \n",
       "2       2013-03-01   0.0   0.0   0.0  0.0   0.0  0.0  0.0  0.0  0.0  ...    \n",
       "3       2013-04-01   0.0   0.0   0.0  0.0   0.0  0.0  0.0  0.0  0.0  ...    \n",
       "4       2013-05-01   0.0   0.0   0.0  0.0   0.0  0.0  0.0  0.0  0.0  ...    \n",
       "\n",
       "shop_id    59                                                        \n",
       "item_id 22144 22145 22150 22151 22153 22154 22155 22162 22164 22167  \n",
       "0         0.0   0.0   0.0   2.0   0.0   1.0   0.0   0.0   0.0   0.0  \n",
       "1         0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0  \n",
       "2         0.0   0.0   0.0   1.0   0.0   0.0   0.0   0.0   0.0   0.0  \n",
       "3         0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0  \n",
       "4         0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0  \n",
       "\n",
       "[5 rows x 424125 columns]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# get the unique combinations of item-store from the sales data at monthly level\n",
    "monthly_sales=sales.groupby([\"shop_id\",\"item_id\",\"date_block_num\"])[\"item_cnt_day\"].sum()\n",
    "# arrange it conviniently to perform the hts \n",
    "monthly_sales=monthly_sales.unstack(level=-1).fillna(0)\n",
    "monthly_sales=monthly_sales.T\n",
    "dates=pd.date_range(start = '2013-01-01',end='2015-10-01', freq = 'MS')\n",
    "monthly_sales.index=dates\n",
    "monthly_sales=monthly_sales.reset_index()\n",
    "monthly_sales.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import time\n",
    "start_time=time.time()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>shop_id</th>\n",
       "      <th>index</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>...</th>\n",
       "      <th>50</th>\n",
       "      <th>51</th>\n",
       "      <th>52</th>\n",
       "      <th>53</th>\n",
       "      <th>54</th>\n",
       "      <th>55</th>\n",
       "      <th>56</th>\n",
       "      <th>57</th>\n",
       "      <th>58</th>\n",
       "      <th>59</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2013-01-01</td>\n",
       "      <td>5578.0</td>\n",
       "      <td>2947.0</td>\n",
       "      <td>1146.0</td>\n",
       "      <td>767.0</td>\n",
       "      <td>2114.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3686.0</td>\n",
       "      <td>2495.0</td>\n",
       "      <td>1463.0</td>\n",
       "      <td>...</td>\n",
       "      <td>3406.0</td>\n",
       "      <td>2748.0</td>\n",
       "      <td>1812.0</td>\n",
       "      <td>2055.0</td>\n",
       "      <td>9386.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3238.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2017.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2013-02-01</td>\n",
       "      <td>6127.0</td>\n",
       "      <td>3364.0</td>\n",
       "      <td>488.0</td>\n",
       "      <td>798.0</td>\n",
       "      <td>2025.0</td>\n",
       "      <td>877.0</td>\n",
       "      <td>4007.0</td>\n",
       "      <td>2513.0</td>\n",
       "      <td>1156.0</td>\n",
       "      <td>...</td>\n",
       "      <td>3054.0</td>\n",
       "      <td>2284.0</td>\n",
       "      <td>1737.0</td>\n",
       "      <td>1906.0</td>\n",
       "      <td>8075.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2655.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1897.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2013-03-01</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>753.0</td>\n",
       "      <td>959.0</td>\n",
       "      <td>2060.0</td>\n",
       "      <td>1355.0</td>\n",
       "      <td>4519.0</td>\n",
       "      <td>2460.0</td>\n",
       "      <td>977.0</td>\n",
       "      <td>...</td>\n",
       "      <td>3610.0</td>\n",
       "      <td>2605.0</td>\n",
       "      <td>2034.0</td>\n",
       "      <td>2365.0</td>\n",
       "      <td>9488.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3099.0</td>\n",
       "      <td>6586.0</td>\n",
       "      <td>3773.0</td>\n",
       "      <td>2028.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2013-04-01</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>583.0</td>\n",
       "      <td>647.0</td>\n",
       "      <td>285.0</td>\n",
       "      <td>1008.0</td>\n",
       "      <td>3168.0</td>\n",
       "      <td>1540.0</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>2740.0</td>\n",
       "      <td>1945.0</td>\n",
       "      <td>1446.0</td>\n",
       "      <td>1515.0</td>\n",
       "      <td>6726.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2153.0</td>\n",
       "      <td>5493.0</td>\n",
       "      <td>2831.0</td>\n",
       "      <td>1388.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2013-05-01</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>553.0</td>\n",
       "      <td>710.0</td>\n",
       "      <td>1211.0</td>\n",
       "      <td>1110.0</td>\n",
       "      <td>3022.0</td>\n",
       "      <td>1647.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>2839.0</td>\n",
       "      <td>2243.0</td>\n",
       "      <td>1482.0</td>\n",
       "      <td>1767.0</td>\n",
       "      <td>7006.0</td>\n",
       "      <td>852.0</td>\n",
       "      <td>2140.0</td>\n",
       "      <td>5233.0</td>\n",
       "      <td>2308.0</td>\n",
       "      <td>1374.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 61 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "shop_id      index       0       1       2      3       4       5       6  \\\n",
       "0       2013-01-01  5578.0  2947.0  1146.0  767.0  2114.0     0.0  3686.0   \n",
       "1       2013-02-01  6127.0  3364.0   488.0  798.0  2025.0   877.0  4007.0   \n",
       "2       2013-03-01     0.0     0.0   753.0  959.0  2060.0  1355.0  4519.0   \n",
       "3       2013-04-01     0.0     0.0   583.0  647.0   285.0  1008.0  3168.0   \n",
       "4       2013-05-01     0.0     0.0   553.0  710.0  1211.0  1110.0  3022.0   \n",
       "\n",
       "shop_id       7       8   ...        50      51      52      53      54  \\\n",
       "0        2495.0  1463.0   ...    3406.0  2748.0  1812.0  2055.0  9386.0   \n",
       "1        2513.0  1156.0   ...    3054.0  2284.0  1737.0  1906.0  8075.0   \n",
       "2        2460.0   977.0   ...    3610.0  2605.0  2034.0  2365.0  9488.0   \n",
       "3        1540.0    -1.0   ...    2740.0  1945.0  1446.0  1515.0  6726.0   \n",
       "4        1647.0     0.0   ...    2839.0  2243.0  1482.0  1767.0  7006.0   \n",
       "\n",
       "shop_id     55      56      57      58      59  \n",
       "0          0.0  3238.0     0.0     0.0  2017.0  \n",
       "1          0.0  2655.0     0.0     0.0  1897.0  \n",
       "2          0.0  3099.0  6586.0  3773.0  2028.0  \n",
       "3          0.0  2153.0  5493.0  2831.0  1388.0  \n",
       "4        852.0  2140.0  5233.0  2308.0  1374.0  \n",
       "\n",
       "[5 rows x 61 columns]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "monthly_shop_sales=sales.groupby([\"date_block_num\",\"shop_id\"])[\"item_cnt_day\"].sum()\n",
    "# get the shops to the columns\n",
    "monthly_shop_sales=monthly_shop_sales.unstack(level=1)\n",
    "monthly_shop_sales=monthly_shop_sales.fillna(0)\n",
    "monthly_shop_sales.index=dates\n",
    "monthly_shop_sales=monthly_shop_sales.reset_index()\n",
    "monthly_shop_sales.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "start_time=time.time()\n",
    "\n",
    "# Calculating the base forecasts using prophet\n",
    "# From HTSprophet pachage -- https://github.com/CollinRooney12/htsprophet/blob/master/htsprophet/hts.py\n",
    "forecastsDict = {}\n",
    "for node in range(len(monthly_shop_sales)):\n",
    "    # take the date-column and the col to be forecasted\n",
    "    nodeToForecast = pd.concat([monthly_shop_sales.iloc[:,0], monthly_shop_sales.iloc[:, node+1]], axis = 1)\n",
    "    #print(nodeToForecast.head())  # just to check\n",
    "# rename for prophet compatability\n",
    "    nodeToForecast = nodeToForecast.rename(columns = {nodeToForecast.columns[0] : 'ds'})\n",
    "    nodeToForecast = nodeToForecast.rename(columns = {nodeToForecast.columns[1] : 'y'})\n",
    "    growth = 'linear'\n",
    "    m = Prophet(growth, yearly_seasonality=True, weekly_seasonality=False, daily_seasonality=False)\n",
    "    m.fit(nodeToForecast)\n",
    "    future = m.make_future_dataframe(periods = 1, freq = 'MS')\n",
    "    forecastsDict[node] = m.predict(future)\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-892.10640093, -630.97864383, 1117.99124546,  863.27884569,\n",
       "        991.67017781, 1415.02605712, 2243.95084582, 1783.6924638 ,\n",
       "       -259.7936578 , -273.10445503,  560.6373099 ,   22.53146144,\n",
       "       4444.78645357, -326.4505154 , 1302.2203591 , 1708.72322222,\n",
       "       1025.30766523,  944.87110942,  865.66089496, 1787.60673754,\n",
       "       -681.3929367 , 2132.79501877, 1655.26469391, -676.85062599,\n",
       "       1656.96157207, 6748.06068987, 1428.50304092, 3614.84600384,\n",
       "       4179.68388699,  731.69578914,  392.76834122, 8212.11254203,\n",
       "       -714.54848916,  455.87994092])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predictions = np.zeros([len(forecastsDict[0].yhat),1]) \n",
    "\n",
    "nCols = len(list(forecastsDict.keys()))+1\n",
    "for key in range(0, nCols-1):\n",
    "    f1 = np.array(forecastsDict[key].yhat)\n",
    "    f2 = f1[:, np.newaxis]\n",
    "    if key==0:\n",
    "        predictions=f2.copy()\n",
    "       # print(predictions.shape)\n",
    "    else:\n",
    "       predictions = np.concatenate((predictions, f2), axis = 1)\n",
    "predictions_unknown=predictions[-1]\n",
    "predictions_unknown"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LSTM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "from nested_lstm import NestedLSTMCell, NestedLSTM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from keras.models import Sequential\n",
    "from keras.layers import LSTM, Dense, Activation\n",
    "from keras.optimizers import Adam, SGD, RMSprop\n",
    "from keras import backend as K"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "nested_lstm_1 (NestedLSTM)   (None, 40)                19680     \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 1)                 41        \n",
      "=================================================================\n",
      "Total params: 19,721\n",
      "Trainable params: 19,721\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = Sequential()\n",
    "model.add(NestedLSTM(40, input_shape=(33, 1), depth=2, dropout=0.0, recurrent_dropout=0.0))\n",
    "model.add(Dense(1))\n",
    "\n",
    "# The adam optimizer works pretty well, although you might try RMSProp as well\n",
    "model.compile(loss='mse',\n",
    "              optimizer='adam',\n",
    "              metrics=['mean_squared_error'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df = sales.groupby([sales.date.apply(lambda x: x.strftime('%Y-%m')),'item_id','shop_id']).sum().reset_index()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>date</th>\n",
       "      <th>item_id</th>\n",
       "      <th>shop_id</th>\n",
       "      <th>2013-01</th>\n",
       "      <th>2013-02</th>\n",
       "      <th>2013-03</th>\n",
       "      <th>2013-04</th>\n",
       "      <th>2013-05</th>\n",
       "      <th>2013-06</th>\n",
       "      <th>2013-07</th>\n",
       "      <th>2013-08</th>\n",
       "      <th>...</th>\n",
       "      <th>2015-01</th>\n",
       "      <th>2015-02</th>\n",
       "      <th>2015-03</th>\n",
       "      <th>2015-04</th>\n",
       "      <th>2015-05</th>\n",
       "      <th>2015-06</th>\n",
       "      <th>2015-07</th>\n",
       "      <th>2015-08</th>\n",
       "      <th>2015-09</th>\n",
       "      <th>2015-10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>54</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>55</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>54</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>54</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>54</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 36 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "date  item_id  shop_id  2013-01  2013-02  2013-03  2013-04  2013-05  2013-06  \\\n",
       "0           0       54        0        0        0        0        0        0   \n",
       "1           1       55        0        0        0        0        0        0   \n",
       "2           2       54        0        0        0        0        0        0   \n",
       "3           3       54        0        0        0        0        0        0   \n",
       "4           4       54        0        0        0        0        0        0   \n",
       "\n",
       "date  2013-07  2013-08   ...     2015-01  2015-02  2015-03  2015-04  2015-05  \\\n",
       "0           0        0   ...           0        0        0        0        0   \n",
       "1           0        0   ...           0        0        0        0        0   \n",
       "2           0        0   ...           0        0        0        0        0   \n",
       "3           0        0   ...           0        0        0        0        0   \n",
       "4           0        0   ...           0        0        0        0        0   \n",
       "\n",
       "date  2015-06  2015-07  2015-08  2015-09  2015-10  \n",
       "0           0        0        0        0        0  \n",
       "1           0        0        0        0        0  \n",
       "2           0        0        0        0        0  \n",
       "3           0        0        0        0        0  \n",
       "4           0        0        0        0        0  \n",
       "\n",
       "[5 rows x 36 columns]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = df[['date','item_id','shop_id','item_cnt_day']]\n",
    "df = df.pivot_table(index=['item_id','shop_id'], columns='date',values='item_cnt_day',fill_value=0).reset_index()\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "      <th>shop_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>2013-01</th>\n",
       "      <th>2013-02</th>\n",
       "      <th>2013-03</th>\n",
       "      <th>2013-04</th>\n",
       "      <th>2013-05</th>\n",
       "      <th>2013-06</th>\n",
       "      <th>2013-07</th>\n",
       "      <th>...</th>\n",
       "      <th>2015-01</th>\n",
       "      <th>2015-02</th>\n",
       "      <th>2015-03</th>\n",
       "      <th>2015-04</th>\n",
       "      <th>2015-05</th>\n",
       "      <th>2015-06</th>\n",
       "      <th>2015-07</th>\n",
       "      <th>2015-08</th>\n",
       "      <th>2015-09</th>\n",
       "      <th>2015-10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>5037</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>5320</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>5</td>\n",
       "      <td>5233</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>5</td>\n",
       "      <td>5232</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>5268</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 37 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   ID  shop_id  item_id  2013-01  2013-02  2013-03  2013-04  2013-05  2013-06  \\\n",
       "0   0        5     5037      0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "1   1        5     5320      0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "2   2        5     5233      0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "3   3        5     5232      0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "4   4        5     5268      0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "\n",
       "   2013-07   ...     2015-01  2015-02  2015-03  2015-04  2015-05  2015-06  \\\n",
       "0      0.0   ...         2.0      0.0      0.0      0.0      1.0      1.0   \n",
       "1      0.0   ...         0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "2      0.0   ...         0.0      0.0      0.0      0.0      3.0      2.0   \n",
       "3      0.0   ...         0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "4      0.0   ...         0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "\n",
       "   2015-07  2015-08  2015-09  2015-10  \n",
       "0      1.0      3.0      1.0      0.0  \n",
       "1      0.0      0.0      0.0      0.0  \n",
       "2      0.0      1.0      3.0      1.0  \n",
       "3      0.0      1.0      0.0      0.0  \n",
       "4      0.0      0.0      0.0      0.0  \n",
       "\n",
       "[5 rows x 37 columns]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_test = pd.merge(test, df, on=['item_id','shop_id'], how='left')\n",
    "df_test = df_test.fillna(0)\n",
    "df_test.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>2013-01</th>\n",
       "      <th>2013-02</th>\n",
       "      <th>2013-03</th>\n",
       "      <th>2013-04</th>\n",
       "      <th>2013-05</th>\n",
       "      <th>2013-06</th>\n",
       "      <th>2013-07</th>\n",
       "      <th>2013-08</th>\n",
       "      <th>2013-09</th>\n",
       "      <th>2013-10</th>\n",
       "      <th>...</th>\n",
       "      <th>2015-01</th>\n",
       "      <th>2015-02</th>\n",
       "      <th>2015-03</th>\n",
       "      <th>2015-04</th>\n",
       "      <th>2015-05</th>\n",
       "      <th>2015-06</th>\n",
       "      <th>2015-07</th>\n",
       "      <th>2015-08</th>\n",
       "      <th>2015-09</th>\n",
       "      <th>2015-10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 34 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   2013-01  2013-02  2013-03  2013-04  2013-05  2013-06  2013-07  2013-08  \\\n",
       "0      0.0      0.0      0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "1      0.0      0.0      0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "2      0.0      0.0      0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "3      0.0      0.0      0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "4      0.0      0.0      0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "\n",
       "   2013-09  2013-10   ...     2015-01  2015-02  2015-03  2015-04  2015-05  \\\n",
       "0      0.0      0.0   ...         2.0      0.0      0.0      0.0      1.0   \n",
       "1      0.0      0.0   ...         0.0      0.0      0.0      0.0      0.0   \n",
       "2      0.0      0.0   ...         0.0      0.0      0.0      0.0      3.0   \n",
       "3      0.0      0.0   ...         0.0      0.0      0.0      0.0      0.0   \n",
       "4      0.0      0.0   ...         0.0      0.0      0.0      0.0      0.0   \n",
       "\n",
       "   2015-06  2015-07  2015-08  2015-09  2015-10  \n",
       "0      1.0      1.0      3.0      1.0      0.0  \n",
       "1      0.0      0.0      0.0      0.0      0.0  \n",
       "2      2.0      0.0      1.0      3.0      1.0  \n",
       "3      0.0      0.0      1.0      0.0      0.0  \n",
       "4      0.0      0.0      0.0      0.0      0.0  \n",
       "\n",
       "[5 rows x 34 columns]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_test = df_test.drop(labels=['ID', 'shop_id', 'item_id'], axis=1)\n",
    "df_test.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "TARGET = '2015-10'\n",
    "y_train = df_test[TARGET]\n",
    "X_train = df_test.drop(labels=[TARGET], axis=1)\n",
    "X_train = X_train.as_matrix()\n",
    "X_train = X_train.reshape((214200, 33, 1))\n",
    "\n",
    "y_train = y_train.as_matrix()\n",
    "y_train = y_train.reshape(214200, 1)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_test = df_test.drop(labels=['2013-01'],axis=1)\n",
    "X_test = X_test.as_matrix()\n",
    "X_test = X_test.reshape((214200, 33, 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "      <th>shop_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>2013-01</th>\n",
       "      <th>2013-02</th>\n",
       "      <th>2013-03</th>\n",
       "      <th>2013-04</th>\n",
       "      <th>2013-05</th>\n",
       "      <th>2013-06</th>\n",
       "      <th>2013-07</th>\n",
       "      <th>...</th>\n",
       "      <th>2015-01</th>\n",
       "      <th>2015-02</th>\n",
       "      <th>2015-03</th>\n",
       "      <th>2015-04</th>\n",
       "      <th>2015-05</th>\n",
       "      <th>2015-06</th>\n",
       "      <th>2015-07</th>\n",
       "      <th>2015-08</th>\n",
       "      <th>2015-09</th>\n",
       "      <th>2015-10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>5037</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>5320</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>5</td>\n",
       "      <td>5233</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>5</td>\n",
       "      <td>5232</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>5268</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 37 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   ID  shop_id  item_id  2013-01  2013-02  2013-03  2013-04  2013-05  2013-06  \\\n",
       "0   0        5     5037      0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "1   1        5     5320      0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "2   2        5     5233      0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "3   3        5     5232      0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "4   4        5     5268      0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "\n",
       "   2013-07   ...     2015-01  2015-02  2015-03  2015-04  2015-05  2015-06  \\\n",
       "0      0.0   ...         2.0      0.0      0.0      0.0      1.0      1.0   \n",
       "1      0.0   ...         0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "2      0.0   ...         0.0      0.0      0.0      0.0      3.0      2.0   \n",
       "3      0.0   ...         0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "4      0.0   ...         0.0      0.0      0.0      0.0      0.0      0.0   \n",
       "\n",
       "   2015-07  2015-08  2015-09  2015-10  \n",
       "0      1.0      3.0      1.0      0.0  \n",
       "1      0.0      0.0      0.0      0.0  \n",
       "2      0.0      1.0      3.0      1.0  \n",
       "3      0.0      1.0      0.0      0.0  \n",
       "4      0.0      0.0      0.0      0.0  \n",
       "\n",
       "[5 rows x 37 columns]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_test = pd.merge(test, df, on=['item_id','shop_id'], how='left')\n",
    "df_test = df_test.fillna(0)\n",
    "df_test.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/50\n",
      "214200/214200 [==============================] - 191s 890us/step - loss: 29.9995 - mean_squared_error: 29.9995\n",
      "Epoch 2/50\n",
      "214200/214200 [==============================] - 194s 904us/step - loss: 29.8037 - mean_squared_error: 29.8037\n",
      "Epoch 3/50\n",
      "214200/214200 [==============================] - 191s 893us/step - loss: 29.6390 - mean_squared_error: 29.6390\n",
      "Epoch 4/50\n",
      "214200/214200 [==============================] - 190s 889us/step - loss: 29.4714 - mean_squared_error: 29.4714\n",
      "Epoch 5/50\n",
      "214200/214200 [==============================] - 192s 899us/step - loss: 29.4210 - mean_squared_error: 29.4210\n",
      "Epoch 6/50\n",
      "214200/214200 [==============================] - 191s 890us/step - loss: 29.0600 - mean_squared_error: 29.0600\n",
      "Epoch 7/50\n",
      "214200/214200 [==============================] - 192s 898us/step - loss: 28.8994 - mean_squared_error: 28.8994\n",
      "Epoch 8/50\n",
      "214200/214200 [==============================] - 199s 929us/step - loss: 28.6825 - mean_squared_error: 28.6825\n",
      "Epoch 9/50\n",
      "214200/214200 [==============================] - 193s 903us/step - loss: 28.7702 - mean_squared_error: 28.7702\n",
      "Epoch 10/50\n",
      "214200/214200 [==============================] - 186s 868us/step - loss: 28.7012 - mean_squared_error: 28.7012\n",
      "Epoch 11/50\n",
      "214200/214200 [==============================] - 192s 898us/step - loss: 28.6202 - mean_squared_error: 28.6202\n",
      "Epoch 12/50\n",
      "214200/214200 [==============================] - 190s 887us/step - loss: 28.5756 - mean_squared_error: 28.5756\n",
      "Epoch 13/50\n",
      "214200/214200 [==============================] - 189s 880us/step - loss: 28.5667 - mean_squared_error: 28.5667\n",
      "Epoch 14/50\n",
      "214200/214200 [==============================] - 190s 888us/step - loss: 28.3955 - mean_squared_error: 28.3955\n",
      "Epoch 15/50\n",
      "214200/214200 [==============================] - 190s 887us/step - loss: 28.3036 - mean_squared_error: 28.3036\n",
      "Epoch 16/50\n",
      "214200/214200 [==============================] - 200s 935us/step - loss: 28.2357 - mean_squared_error: 28.2357\n",
      "Epoch 17/50\n",
      "214200/214200 [==============================] - 192s 899us/step - loss: 28.2375 - mean_squared_error: 28.2375\n",
      "Epoch 18/50\n",
      "100320/214200 [=============>................] - ETA: 1:39 - loss: 52.0515 - mean_squared_error: 52.0515"
     ]
    }
   ],
   "source": [
    "#TODO: reduce batch size and increase number of epochs, see where it converges.\n",
    "BATCH = 32\n",
    "model.fit(X_train, y_train,\n",
    "          batch_size=BATCH,\n",
    "          epochs=50\n",
    "         )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Light GBM "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import (roc_curve, auc, accuracy_score)\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "import lightgbm as lgb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "print X_train[:,:,0].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "     lgb_params = {\n",
    "                   'feature_fraction': 0.75,\n",
    "                   'metric': 'rmse',\n",
    "                   'nthread':1,\n",
    "                   'min_data_in_leaf': 2**7,\n",
    "                   'bagging_fraction': 0.75,\n",
    "                   'learning_rate': 0.03,\n",
    "                   'objective': 'mse',\n",
    "                   'bagging_seed': 2**7,\n",
    "                   'num_leaves': 2**7,\n",
    "                   'bagging_freq':1,\n",
    "                   'verbose':0\n",
    "                   }\n",
    "\n",
    "\n",
    "mdl = lgb.LGBMClassifier()\n",
    "\n",
    "# To view the default model params:\n",
    "mdl.get_params().keys()\n",
    "\n",
    "# Create the grid\n",
    "grid = GridSearchCV(mdl, lgb_params, verbose=1, cv=4, n_jobs=-1)\n",
    "# Run the grid\n",
    "grid.fit(X_train[:,:,0], y_train)\n",
    "\n",
    "# Print the best parameters found\n",
    "print(grid.best_params_)\n",
    "print(grid.best_score_)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## SVM "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Process PoolWorker-14:\n",
      "Process PoolWorker-17:\n",
      "Process PoolWorker-13:\n",
      "Process PoolWorker-18:\n",
      "Process PoolWorker-19:\n",
      "Traceback (most recent call last):\n",
      "Traceback (most recent call last):\n",
      "Traceback (most recent call last):\n",
      "Traceback (most recent call last):\n",
      "Traceback (most recent call last):\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 267, in _bootstrap\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 267, in _bootstrap\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 267, in _bootstrap\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 267, in _bootstrap\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 267, in _bootstrap\n",
      "    self.run()\n",
      "    self.run()\n",
      "    self.run()\n",
      "    self.run()\n",
      "    self.run()\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 114, in run\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 114, in run\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 114, in run\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 114, in run\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 114, in run\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.py\", line 102, in worker\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.py\", line 102, in worker\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.py\", line 102, in worker\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.py\", line 102, in worker\n",
      "    task = get()\n",
      "    task = get()\n",
      "    task = get()\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.py\", line 102, in worker\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/pool.py\", line 360, in get\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/pool.py\", line 362, in get\n",
      "    task = get()\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/pool.py\", line 360, in get\n",
      "    task = get()\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/pool.py\", line 360, in get\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/pool.py\", line 360, in get\n",
      "    racquire()\n",
      "    return recv()\n",
      "    racquire()\n",
      "    racquire()\n",
      "    racquire()\n",
      "KeyboardInterrupt\n",
      "KeyboardInterrupt\n",
      "KeyboardInterrupt\n",
      "KeyboardInterrupt\n",
      "KeyboardInterrupt\n",
      "Process PoolWorker-21:\n",
      "Process PoolWorker-20:\n",
      "Process PoolWorker-22:\n",
      "Process PoolWorker-23:\n",
      "Process PoolWorker-24:\n",
      "Traceback (most recent call last):\n",
      "Traceback (most recent call last):\n",
      "Traceback (most recent call last):\n",
      "Traceback (most recent call last):\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 267, in _bootstrap\n",
      "Traceback (most recent call last):\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 267, in _bootstrap\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 267, in _bootstrap\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 267, in _bootstrap\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 267, in _bootstrap\n",
      "    self.run()\n",
      "    self.run()\n",
      "    self.run()\n",
      "    self.run()\n",
      "    self.run()\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 114, in run\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 114, in run\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 114, in run\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 114, in run\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 114, in run\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.py\", line 102, in worker\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.py\", line 102, in worker\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.py\", line 102, in worker\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "    task = get()\n",
      "    task = get()\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.py\", line 102, in worker\n",
      "    task = get()\n",
      "    task = get()\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/pool.py\", line 362, in get\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/pool.py\", line 360, in get\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.py\", line 102, in worker\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/pool.py\", line 360, in get\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/pool.py\", line 360, in get\n",
      "    task = get()\n",
      "    racquire()\n",
      "    racquire()\n",
      "    return recv()\n",
      "KeyboardInterrupt\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/pool.py\", line 360, in get\n",
      "    racquire()\n",
      "KeyboardInterrupt\n",
      "KeyboardInterrupt\n",
      "KeyboardInterrupt\n",
      "    racquire()\n",
      "KeyboardInterrupt\n",
      "Process PoolWorker-28:\n",
      "Process PoolWorker-29:\n",
      "Process PoolWorker-27:\n",
      "Traceback (most recent call last):\n",
      "Traceback (most recent call last):\n",
      "Process PoolWorker-26:\n",
      "Traceback (most recent call last):\n",
      "Process PoolWorker-25:\n",
      "Traceback (most recent call last):\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 267, in _bootstrap\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 267, in _bootstrap\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 267, in _bootstrap\n",
      "Traceback (most recent call last):\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 267, in _bootstrap\n",
      "    self.run()\n",
      "    self.run()\n",
      "    self.run()\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 267, in _bootstrap\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 114, in run\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 114, in run\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 114, in run\n",
      "    self.run()\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "    self.run()\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 114, in run\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.py\", line 102, in worker\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.py\", line 102, in worker\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/process.py\", line 114, in run\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.py\", line 102, in worker\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "    task = get()\n",
      "    task = get()\n",
      "    self._target(*self._args, **self._kwargs)\n",
      "    task = get()\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/pool.py\", line 360, in get\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.py\", line 102, in worker\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/pool.py\", line 360, in get\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.py\", line 102, in worker\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/pool.py\", line 360, in get\n",
      "    racquire()\n",
      "    task = get()\n",
      "    task = get()\n",
      "    racquire()\n",
      "    racquire()\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/pool.py\", line 360, in get\n",
      "KeyboardInterrupt\n",
      "KeyboardInterrupt\n",
      "  File \"/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/pool.py\", line 362, in get\n",
      "KeyboardInterrupt\n",
      "    racquire()\n",
      "    return recv()\n",
      "KeyboardInterrupt\n",
      "KeyboardInterrupt\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-39-0e72f9ac7fd2>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0mparam1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'C'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mgrid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mGridSearchCV\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mSVR\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparam1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcv\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mscoring\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'neg_mean_squared_error'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mgrid\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/model_selection/_search.pyc\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, X, y, groups, **fit_params)\u001b[0m\n\u001b[1;32m    637\u001b[0m                                   error_score=self.error_score)\n\u001b[1;32m    638\u001b[0m           for parameters, (train, test) in product(candidate_params,\n\u001b[0;32m--> 639\u001b[0;31m                                                    cv.split(X, y, groups)))\n\u001b[0m\u001b[1;32m    640\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    641\u001b[0m         \u001b[0;31m# if one choose to see train score, \"out\" will contain train score info\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, iterable)\u001b[0m\n\u001b[1;32m    787\u001b[0m                 \u001b[0;31m# consumption.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    788\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_iterating\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 789\u001b[0;31m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretrieve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    790\u001b[0m             \u001b[0;31m# Make sure that we get a last message telling us we are done\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    791\u001b[0m             \u001b[0melapsed_time\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_start_time\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/Users/vamsighorakavi/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc\u001b[0m in \u001b[0;36mretrieve\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    697\u001b[0m             \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    698\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'supports_timeout'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 699\u001b[0;31m                     \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    700\u001b[0m                 \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    701\u001b[0m                     \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.pyc\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    564\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    565\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 566\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    567\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_ready\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    568\u001b[0m             \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/Users/vamsighorakavi/anaconda2/lib/python2.7/multiprocessing/pool.pyc\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    559\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    560\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_ready\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 561\u001b[0;31m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cond\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    562\u001b[0m         \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    563\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cond\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrelease\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/Users/vamsighorakavi/anaconda2/lib/python2.7/threading.pyc\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m    338\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m    \u001b[0;31m# restore state no matter what (e.g., KeyboardInterrupt)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    339\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 340\u001b[0;31m                 \u001b[0mwaiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquire\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    341\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0m__debug__\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    342\u001b[0m                     \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_note\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"%s.wait(): got it\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "from sklearn.svm import SVR\n",
    "param1 = {'C': [1]}\n",
    "grid = GridSearchCV(SVR(), param1, cv=5, n_jobs=-1, scoring='neg_mean_squared_error')\n",
    "grid.fit(X_train[:, :,0], y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from keras.layers import Dense\n",
    "from keras.wrappers.scikit_learn import KerasRegressor\n",
    "\n",
    "def baseline_model():\n",
    "     \t# create model\n",
    "    model = Sequential()\n",
    "    model.add(Dense(20, input_dim=train_x.shape[1], kernel_initializer='uniform', activation='softplus'))\n",
    "    model.add(Dense(1, kernel_initializer='uniform', activation = 'relu'))\n",
    "         # Compile model\n",
    "    model.compile(loss='mse', optimizer='Nadam', metrics=['mse'])\n",
    "    model.compile(loss='mean_squared_error', optimizer='adam')\n",
    "    return model\n",
    "\n",
    "estimator = KerasRegressor(build_fn=baseline_model, verbose=1, epochs=5, batch_size = 55000)\n",
    "\n",
    "estimator.fit(X_train, y_train)\n",
    "y_pred = estimator.predict(X_test).clip(0., 20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "\n",
    "#y_pred = model.predict(X_test).clip(0., 20.)\n",
    "\n",
    "# Create the submission file and submit!\n",
    "preds = pd.DataFrame(y_pred, columns=['item_cnt_month'])\n",
    "preds.to_csv('submission.csv',index_label='ID')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## XGBoost"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from xgboost import XGBRegressor\n",
    "param_test2 = {\n",
    " 'max_depth':range(3,10,2),\n",
    " 'min_child_weight':range(1,6,2)\n",
    "}\n",
    "gsearch2 = GridSearchCV(estimator = XGBRegressor( learning_rate=0.1, n_estimators=140, max_depth=5,\n",
    " min_child_weight=2, gamma=0, subsample=0.8, colsample_bytree=0.8, nthread=4, scale_pos_weight=1,seed=27), \n",
    " param_grid = param_test2, scoring='neg_mean_squared_error',n_jobs=4,iid=False, cv=5)\n",
    "gsearch2.fit(X_train[:,:,0],y_train)\n",
    "gsearch2.grid_scores_, gsearch2.best_params_, gsearch2.best_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## IndRNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from ind_rnn_cell import IndRNNCell"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "cell = IndRNNCell(num_units=4,\n",
    "                        recurrent_min_abs=1.,)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "TIME_STEPS = 100\n",
    "NUM_UNITS = 128\n",
    "LEARNING_RATE_INIT = 0.0002\n",
    "LEARNING_RATE_DECAY_STEPS = 20000\n",
    "RECURRENT_MAX = pow(2, 1 / TIME_STEPS)\n",
    "\n",
    "# Parameters taken from https://arxiv.org/abs/1511.06464\n",
    "BATCH_SIZE = 50\n",
    "import tensorflow as tf\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Step [x100] 0 MSE 30.8686981201\n",
      "Step [x100] 0 MSE 30.8322181702\n",
      "Step [x100] 0 MSE 30.7982234955\n",
      "Step [x100] 0 MSE 30.7625274658\n",
      "Step [x100] 0 MSE 30.7230415344\n",
      "Step [x100] 0 MSE 30.6785945892\n",
      "Step [x100] 0 MSE 30.6285305023\n",
      "Step [x100] 0 MSE 30.572303772\n",
      "Step [x100] 0 MSE 30.5095386505\n",
      "Step [x100] 0 MSE 30.4398384094\n",
      "Step [x100] 0 MSE 30.3629169464\n",
      "Step [x100] 0 MSE 30.2786579132\n",
      "Step [x100] 0 MSE 30.1870956421\n",
      "Step [x100] 0 MSE 30.0884037018\n"
     ]
    }
   ],
   "source": [
    "tf.reset_default_graph()\n",
    "# Placeholders for training data\n",
    "inputs_ph = tf.placeholder(tf.float32, shape=X_train.shape)\n",
    "targets_ph = tf.placeholder(tf.float32, shape=y_train.shape)\n",
    "\n",
    "  # Build the graph\n",
    "first_input_init = tf.random_uniform_initializer(-RECURRENT_MAX,\n",
    "                                                   RECURRENT_MAX)\n",
    "first_layer = IndRNNCell(NUM_UNITS, recurrent_max_abs=RECURRENT_MAX,\n",
    "                           recurrent_kernel_initializer=first_input_init)\n",
    "second_layer = IndRNNCell(NUM_UNITS, recurrent_max_abs=RECURRENT_MAX)\n",
    "\n",
    "cell = tf.nn.rnn_cell.MultiRNNCell([first_layer, second_layer])\n",
    "  # cell = tf.nn.rnn_cell.BasicLSTMCell(NUM_UNITS) uncomment this for LSTM runs\n",
    "\n",
    "output, state = tf.nn.dynamic_rnn(cell, inputs_ph, dtype=tf.float32)\n",
    "last = output[:, -1, :]\n",
    "\n",
    "weight = tf.get_variable(\"softmax_weight\", shape=[NUM_UNITS, 1])\n",
    "bias = tf.get_variable(\"softmax_bias\", shape=[1],\n",
    "                         initializer=tf.constant_initializer(0.1))\n",
    "prediction = tf.squeeze(tf.matmul(last, weight) + bias)\n",
    "\n",
    "loss_op = tf.losses.mean_squared_error(tf.squeeze(targets_ph), prediction)\n",
    "\n",
    "global_step = tf.get_variable(\"global_step\", shape=[], trainable=False,\n",
    "                                initializer=tf.zeros_initializer)\n",
    "learning_rate = tf.train.exponential_decay(LEARNING_RATE_INIT, global_step,\n",
    "                                             LEARNING_RATE_DECAY_STEPS, 0.1,\n",
    "                                             staircase=True)\n",
    "optimizer = tf.train.AdamOptimizer(learning_rate)\n",
    "optimize = optimizer.minimize(loss_op, global_step=global_step)\n",
    "\n",
    "# Train the model\n",
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    step = 0\n",
    "    losses=[]\n",
    "    for _ in range(100):\n",
    "        # Generate new input data\n",
    "        inputs, targets = X_train, y_train\n",
    "        loss, _ = sess.run([loss_op, optimize], {inputs_ph: inputs, targets_ph: targets})\n",
    "        losses.append(loss)\n",
    "        step += 1\n",
    "        print(\"Step [x100] {} MSE {}\".format(int(step / 100), np.mean(losses)))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
